use bytes::BytesMut;
use xflv::amf0::Amf0ValueType;

// 设置对等带宽属性
pub struct SetPeerBandwidthProperties {
    // 窗口大小
    pub window_size: u32,
    // 限制类型
    limit_type: u8,
}

impl SetPeerBandwidthProperties {
    pub fn new(window_size: u32, limit_type: u8) -> SetPeerBandwidthProperties {
        Self {
            window_size,
            limit_type,
        }
    }
}

// RTMP 消息类型枚举
pub enum RtmpMessageData {
    // AMF0 命令
    Amf0Command {
        // 命令名称
        command_name: Amf0ValueType,
        // 事务 ID
        transaction_id: Amf0ValueType,
        // 命令对象
        command_object: Amf0ValueType,
        // 其他参数
        others: Vec<Amf0ValueType>,
    },
    // AMF 数据消息
    AmfData {
        // 原始数据
        raw_data: BytesMut,
    },
    // 设置块大小
    SetChunkSize {
        chunk_size: u32,
    },
    // 中止消息
    AbortMessage {
        chunk_stream_id: u32,
    },
    // 确认消息
    Acknowledgement {
        sequence_number: u32,
    },
    // 窗口确认大小消息
    WindowAcknowledgementSize {
        size: u32,
    },
    // 设置对等带宽消息
    SetPeerBandwidth {
        properties: SetPeerBandwidthProperties,
    },
    // 音频数据消息
    AudioData {
        data: BytesMut,
    },
    // 视频数据消息
    VideoData {
        data: BytesMut,
    },
    // 设置缓存区长度消息
    SetBufferLength {
        stream_id: u32,
        buffer_length: u32,
    },
    // 流开始消息
    StreamBegin {
        stream_id: u32,
    },
    // 流被记录消息
    StreamIsRecorded {
        stream_id: u32,
    },
    // 未知消息
    Unknow,
}

// RTMP 消息类型 ID 模块
pub mod msg_type_id {
    // 音频消息类型 ID
    pub const AUDIO: u8 = 8;
    // 视频消息类型 ID
    pub const VIDEO: u8 = 9;
    // 设置块大小消息类型 ID
    pub const SET_CHUNK_SIZE: u8 = 1;
    // 中止消息类型 ID
    pub const ABORT: u8 = 2;
    // 确实消息类型 ID
    pub const ACKNOWLEDGEMENT: u8 = 3;
    // 用户控制事件类型 ID
    pub const USER_CONTROL_EVENT: u8 = 4;
    // 窗口确认大小消息类型 ID
    pub const WIN_ACKNOWLEDGEMENT_SIZE: u8 = 5;
    // 设置对等带宽消息类型 ID
    pub const SET_PEER_BANDWIDTH: u8 = 6;

    // AMF3 命令消息类型 ID
    pub const COMMAND_AMF3: u8 = 17;
    // AMF0 命令消息类型 ID
    pub const COMMAND_AMF0: u8 = 20;

    // AMF3 数据类型 ID
    pub const DATA_AMF3: u8 = 15;
    // AMF0 数据类型 ID
    pub const DATA_AMF0: u8 = 18;

    // AMF3 共享消息对象类型 ID
    pub const SHARED_OBJ_AMF3: u8 = 16;
    // AMF0 共享消息对象类型 ID
    pub const SHARED_OBJ_AMF0: u8 = 19;

    // 聚合消息类型 ID
    pub const AGGREGATE: u8 = 22;
}
